package cz.data.common.mark.mybatis.dialect;

import cz.data.common.support.db.core.DbColumn;
import cz.data.common.support.metadata.MysqlDataTypeEnum;
import cz.data.common.support.metadata.OracleDataTypeEnum;
import cz.data.common.support.metadata.PostgresqlDataTypeEnum;
import cz.data.common.support.metadata.SqlserverDataTypeEnum;
import cz.data.common.support.ColumnParser;
import cz.data.common.support.DataType;
import cz.data.common.database.metadata.parser.MysqlColumnParser;
import cz.data.common.database.metadata.parser.OracleColumnParser;
import cz.data.common.database.metadata.parser.PostgresqlColumnParser;
import cz.data.common.database.metadata.parser.SqlserverColumnParser;

public class DialectDefinition {
    private static final ColumnParser MYSQL_COLUMN_PARSER = new MysqlColumnParser();
    private static final ColumnParser ORACLE_COLUMN_PARSER = new OracleColumnParser();
    private static final ColumnParser SQLSERVER_COLUMN_PARSER = new SqlserverColumnParser();
    private static final ColumnParser POSTGRESQL_COLUMN_PARSER = new PostgresqlColumnParser();

    public static String mysqlColumnStatement(DbColumn column) {
        DataType dataType = MYSQL_COLUMN_PARSER.parse(MysqlDataTypeEnum.match(column.getDataType(), MysqlDataTypeEnum.VARCHAR));
        return dataType.fillTypeString(column.getDataLength(), column.getDataScale());
    }

    public static String oracleColumnStatement(DbColumn column) {
        OracleDataTypeEnum oracleDataTypeEnum = OracleDataTypeEnum.match(column.getDataType(), OracleDataTypeEnum.CHAR);
        DataType dataType = ORACLE_COLUMN_PARSER.parse(oracleDataTypeEnum);
        return dataType.fillTypeString(column.getDataLength(), column.getDataScale());
    }

    public static String sqlserverColumnStatement(DbColumn column) {
        DataType dataType = SQLSERVER_COLUMN_PARSER.parse(SqlserverDataTypeEnum.match(column.getDataType(), SqlserverDataTypeEnum.VARCHAR));
        return dataType.fillTypeString(column.getDataLength(), column.getDataScale());
    }

    public static String postgresqlColumnStatement(DbColumn column) {
        DataType dataType = POSTGRESQL_COLUMN_PARSER.parse(PostgresqlDataTypeEnum.match(column.getDataType(), PostgresqlDataTypeEnum.VARCHAR));
        return dataType.fillTypeString(column.getDataLength(), column.getDataScale());
    }
}
